package com.example.qiandao.service;

import com.example.qiandao.controller.responsedto.ClassDTO;
import com.example.qiandao.controller.responsedto.StudentDTO;
import com.example.qiandao.entity.Clazz;
import com.example.qiandao.entity.User;
import com.example.qiandao.repository.ClazzRepository;
import com.example.qiandao.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class ClassService {

    @Autowired
    private ClazzRepository clazzRepository;

    @Autowired
    private UserRepository userRepository;

    //添加班级
    public boolean addClass(Clazz clazz) {
        Clazz newClazz = clazzRepository.save(clazz);
        return newClazz != null;
    }

    /**
     * 根据班级ID查询该班级下所有学生的信息（包括学生名字和id）
     *
     * @param classId 班级ID
     * @return 学生列表，包含学生名字和id
     */
    public List<StudentDTO> getStudentsByClassId(Long classId) {
        // 从数据库中查询班级信息
        var clazz = clazzRepository.findById(classId)
                .orElseThrow(() -> new RuntimeException("班级不存在"));

        // 获取班级中的学生列表，并转换为 StudentDTO
        return clazz.getStudents().stream()
                .map(student -> new StudentDTO(student.getId(), student.getName(), student.getRole()))
                .collect(Collectors.toList());
    }


    public boolean updateClass(Clazz clazz) {
        Clazz updatedClazz = clazzRepository.save(clazz);
        return updatedClazz != null;
    }

    public boolean deleteClass(Long classId) {
        if (clazzRepository.existsById(classId)) {
            clazzRepository.deleteById(classId);
            return true;
        } else {
            return false;
        }
    }

    /**
     * 学生加入班级
     *
     * @param studentId 学生ID
     * @param classCode 班级码
     * @return 是否成功加入班级
     */
    public boolean joinClass(Long studentId, String classCode) {
        // 根据班级码查找班级
        Clazz clazz = clazzRepository.findByClassCode(classCode);
        if (clazz == null) {
            throw new RuntimeException("班级不存在");
        }

        // 根据学生ID查找用户
        User user = userRepository.findById(studentId)
                .orElseThrow(() -> new RuntimeException("学生不存在"));

        // 将学生加入班级
        user.getClasses().add(clazz);
        userRepository.save(user);

        return true;
    }

    public List<ClassDTO> getClassesByCourseId(Long courseId) {
        return clazzRepository.findClazzesByCourseId(courseId).stream()
                .map(clazz -> new ClassDTO(clazz.getId(), clazz.getClassName(), clazz.getClassCode()))
                .collect(Collectors.toList());
    }

    /**
     * 根据学生ID和课程ID获取学生在此课程下加入的所有班级
     *
     * @param studentId 学生ID
     * @param courseId 课程ID
     * @return 学生在此课程下加入的所有班级
     */
    public List<ClassDTO> getClassesByStudentIdAndCourseId(Long studentId, Long courseId) {
        return clazzRepository.findClassesByStudentIdAndCourseId(studentId, courseId).stream()
                .map(clazz -> new ClassDTO(clazz.getId(), clazz.getClassName(), clazz.getClassCode()))
                .collect(Collectors.toList());
    }

    public Clazz getClassByStudentIdAndClassId(Long studentId, Long classId) {
        return clazzRepository.findById(classId)
                .orElseThrow(() -> new RuntimeException("班级不存在"));
    }
}